<?php
class CRequest
{
	public function get($name)
	{
		return isset($_GET[$name]) ? $_GET[$name] : null;
	}

	public function post($name)
	{
		return isset($_POST[$name]) ? $_POST[$name] : null;
	}

	public function method()
	{
		return mb_strtolower($_SERVER['REQUEST_METHOD'], 'UTF-8');
	}

	public function process()
	{
		$q = mb_strtolower(trim($this->get('q')), 'UTF-8');
		if (empty($q))
			$q = C::app()->config['urls']['root'];

		//lookup path

		$q = explode('/', $q);

		if (count($q) < 2)
			throw new Exception('В запросе не задан контроллер или действие');

		$controllerClass = mb_convert_case($q[0], MB_CASE_TITLE, 'UTF-8').'Controller';
		$actionName = 'action'.mb_strtolower($q[1], 'UTF-8');

		if (!class_exists($controllerClass))
			throw new Exception('Не удается найти контроллер "'.$controllerClass.'"');

		C::addStaticVariable('controller', new $controllerClass());

		$methodsList = get_class_methods(C::controller());
		$methodName = '';

		foreach ($methodsList as $method)
		{
			if (mb_strtolower($method, 'UTF-8') == $actionName)
				$methodName = $method;
		}

		if (empty($methodName))
			throw new Exception('Не удается найти действие "'.$actionName.'" в контроллере "'.$controllerClass.'"');

		C::controller()->id = $q[0];
		C::controller()->action = $q[1];

		$r = new ReflectionMethod($controllerClass, $methodName);
		$params = $r->getParameters();
		$callParams = array();

		foreach ($params as $param) {
			$paramName = $param->getName();
			$paramValue = $this->get($paramName);

			if (!$param->isOptional() && empty($paramValue))
				throw new Exception('В запросе на задано значение параметра "'.$paramName.'" для метода "'.$controllerClass.'::'.$methodName.'"');

			if ($param->isOptional() && empty($paramValue))
				$paramValue = $param->getDefaultValue();

			$callParams[] = $paramValue;
		}

		ob_start();
		$r->invokeArgs(C::controller(), $callParams);
		return ob_get_clean();
	}
}